import 'package:flutter/material.dart';

class ScrollControllerPage1 extends StatefulWidget {
  @override
  State<StatefulWidget> createState() {
    return _ScrollControllerPage1State();
  }
}

class _ScrollControllerPage1State extends State<ScrollControllerPage1> {

  ///
  /// ScrollController构造函数如下：
  /// 
  /// ScrollController({
  ///   double initialScrollOffset = 0.0, //初始滚动位置
  ///   this.keepScrollOffset = true,//是否保存滚动位置
  ///   ...
  /// })
  /// 我们介绍一下ScrollController常用的属性和方法：
  /// 
  /// offset：可滚动组件当前的滚动位置。
  /// jumpTo(double offset)、animateTo(double offset,...)：这两个方法用于跳转到指定的位置，
  ///     它们不同之处在于，后者在跳转时会执行一个动画，而前者不会。
  /// ScrollController还有一些属性和方法，我们将在后面原理部分解释。
  /// 
  /// 滚动监听
  /// ScrollController间接继承自Listenable，我们可以根据ScrollController来监听滚动事件，如：
  /// 
  /// controller.addListener(()=>print(controller.offset))
  /// 
  ScrollController _controller = ScrollController();
  bool showToTopBtn = false;  // 是否显示“返回到顶部”按钮

  @override
  void initState() {
    super.initState();
    // 监听滚动事件，打印滚动位置
    _controller.addListener(() {
      print(_controller); // 打印滚动位置
      if (_controller.offset < 1000 && showToTopBtn) {
        setState(() {
          showToTopBtn = false;
        });
      } else if (_controller.offset >= 1000 && showToTopBtn == false) {
        setState(() {
          showToTopBtn = true;
        });
      }
    });
  }

  @override
  void dispose() {
    // 为了避免内存泄露，需要调用_controller.dispose
    _controller.dispose();
    super.dispose();
  }
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Scroll Controller 1"),
      ),
      body: Scrollbar(
        child: ListView.builder(
          itemCount: 100,
          itemExtent: 50, // 列表项高度固定时，显式指定高度是一个好习惯(性能消耗小)
          controller: _controller,
          itemBuilder: (context, index) {
            return ListTile(
              title: Text("$index"),
            );
          },
        ),
      ),
      floatingActionButton: !showToTopBtn ? null : FloatingActionButton(
        child: Icon(Icons.arrow_upward),
        onPressed: () {
          _controller.animateTo(
            .0,
            duration: Duration(
              milliseconds: 200
            ),
            curve: Curves.ease
          );
        }
      ),
    );
  }
}